#!/usr/bin/env bash

MAINPROMPT="欢迎使用 WingCleaner 清理脚本，用来删除一些恼人的东西，并添加一些个性化的东西，仅支持 Deepin 系统。
下面根据序号来进行相应的操作："

AUTHOR="作者：寂静的羽夏，写 GUI 程序感觉不值当，于是写了个 Shell 脚本，用来处理比较常见的问题。"
PREFIX=">> "
OSFILE="/etc/os-version"

CHOICE0="0. 退出该脚本"
CHOICE1="1. 编辑深度文件管理器的 此电脑 中的 磁盘 多余项目（比如某度盘）"
CHOICE2="2. 编辑多余的 新建 的项目（比如来自 WPS 的多情）"
CHOICE3="3. 修改启动项目"
CHOICE4="4. 清理 APT 包管理"
CHOICE5="5. 编辑文件关联"

CONTINUENEXT="请输入一下命令进行操作："
UNSUPPORT="【错误】该选项未收到支持，如果会有新功能请耐心等待"
NOTDEEPIN="【警告】经过简单检测为非 Deepin 系统，该脚本可能不能生效，甚至造成危害"
UNKNOWISDEEPIN="【警告】经过简单检测不能确定是否为 Deepin 系统，请自行确认。该脚本可能不能生效，甚至造成危害"
DISPLAY5S="文件如下所示， 5s 之后会消失恢复:"
DISPLAY="文件如下所示（冒号前面的为索引）："
DELFINISH="文件删除完毕，但未必成功，请检查结果。"
DELALLCONFIRM="【警告】你确认删除所有的项目吗，这不可恢复！[y/N]"
DELINFO="请选择你要删除的文件索引："
ADDINFO="请输入你要添加的文件路径："
ERRFILE="非法格式文件，故终止操作！"
FINISH="操作完毕！"
ERRFINISH="操作失败！"
FILENOTFOUND="文件不存在！"
PROGRAMTITLE="请输入程序名称："
USAGETITLE="请输入快捷方式用途："
INVAILDINPUT="非法输入！"
PAUSECONTINUE="按任意键继续……"
FILEASSOCIATION="添加文件关联，请务必阅读以下说明，否则大概率不会成功。经测试在本人的电脑成功，不排除其他情况！
1. 首先，进行第一步，需要把想要关联的 desktop 文件路径告诉该程序，具体什么是 desktop 文件，简单说是一个类似快捷方式，具体细节请百度。
2. 本脚本会检查有没有 MimeType 这个成员，如果没有，则会报错，这个是文件关联的必要信息，相关联啥就填啥，如果搞特殊，就自己起一个。
3. 然后，再输入好关联的程序名和用途，仅英文字符，否则判定为错误，无法继续！
4. 本脚本会在桌面生成一个 xml 文件，名称为 程序名-用途 的形式，里面是一个模板，需要填写的均已用 (?=?) 标记，如下所示：

<?xml version='1.0' encoding='utf-8'?>
<mime-info xmlns=\"http://www.freedesktop.org/standards/shared-mime-info\">
    <mime-type type=\"(?=?)\">
		<comment>(?=?)</comment>
		<glob pattern=\"*.(?=?)\" weight=\"80\"/>
	</mime-type>
</mime-info>

5. 填好修后，保存继续。注意：本脚本不会检查文件的正确性，但如果失败，脚本会试图删掉残留。
6. 剩下的就交给脚本了，如果成功的话，就会立刻生效。（如下是我的个人写的例子：）

* desktop 文件：

[Desktop Entry]
Name=Kdenlive
Version=1.0
Exec=\"/opt/apps/org.kdenlive.spark/files/bin/AppRun\" %F
Icon=org.kdenlive.spark
Type=Application
Terminal=false
StartupNotify=true
MimeType=application/x-kdenlive     //这行是我自己加的，一定要和下面的 mime-type 保持一致
Encoding=UTF-8
Categories=AudioVideo;
X-Deepin-CreatedBy=com.deepin.dde.daemon.Launcher
X-Deepin-AppID=org.kdenlive.spark

* xml 文件：

<?xml version='1.0' encoding='utf-8'?>
<mime-info xmlns=\"http://www.freedesktop.org/standards/shared-mime-info\">
    <mime-type type=\"application/x-kdenlive\">
		<comment>Kdenlive Project</comment>     //类似提示这个文件是干啥的
		<glob pattern=\"*.kdenlive\" weight=\"80\"/>    //匹配，类似通过扩展名进一步识别类型，毕竟 Linux 判定打开方式是通过 Magic
	</mime-type>
</mime-info>
"

CHOICE10="0. 返回上一层"
CHOICE11="1. 展示现有的项目"
CHOICE12="2. 删除项目"
CHOICE13="3. 删除所有项目"
CHOICE14="4. 添加项目"

#font color

F_RAD="\e[31m"    #将字符的显示颜色改为红色
F_GREEN="\e[32m"  #将字符的显示颜色改为绿色
F_YELLOW="\e[33m" #将字符的显示颜色改为黄色
F_BLUE="\e[34m"   #将字符的显示颜色改为蓝色
F_PINK="\e[35m"   #将字符的显示颜色改为淡蓝色

#actions

A_DEFAULT="\033[0m" #重新设置属性到缺省设置
A_BOLD="\033[1m"    #设置粗体

#always used
P_NEXT="$F_BLUE$CONTINUENEXT$A_DEFAULT"
P_UNSUPPORT="$F_PINK$A_BOLD$UNSUPPORT$A_DEFAULT"
P_UNKNOWISDEEPIN="$F_PINK$A_BOLD$UNKNOWISDEEPIN$A_DEFAULT"
P_DISPLAY="$F_PINK$DISPLAY$A_DEFAULT"
P_DISPLAY5S="$F_PINK$DISPLAY5S$A_DEFAULT"
P_DELINFO="$F_BLUE$DELINFO$A_DEFAULT"
P_DELFINISH="$F_BLUE$DELFINISH$A_DEFAULT"
P_DELALLCONFIRM="$F_RAD$DELALLCONFIRM$A_DEFAULT"
P_ADDINFO="$F_BLUE$ADDINFO$A_DEFAULT"
P_ERRFILE="$F_RAD$ERRFILE$A_DEFAULT"
P_FINISH="$F_BLUE$FINISH$A_DEFAULT"
P_FILENOTFOUND="$F_RAD$FILENOTFOUND$A_DEFAULT"
P_AUTHOR="$A_BOLD$F_GREEN$AUTHOR$A_DEFAULT"
P_SYS="$F_GREEN【系统自带】$A_DEFAULT"
P_HOME="$F_GREEN【用户自定义】$A_DEFAULT"
P_FILEASSOCIATION="$F_PINK$FILEASSOCIATION$A_DEFAULT"
P_PROGRAMTITLE="$F_PINK$PROGRAMTITLE$A_DEFAULT"
P_USAGETITLE="$F_PINK$USAGETITLE$A_DEFAULT"
P_INVAILDINPUT="$F_PINK$INVAILDINPUT$A_DEFAULT"
P_PAUSECONTINUE="$F_PINK$PAUSECONTINUE$A_DEFAULT"
P_ERRFINISH="$F_PINK$ERRFINISH$A_DEFAULT"

OIFS="$IFS"
NIFS=$'\n'

#script

while :; do

    clear
    echo -e "$F_RAD$MAINPROMPT"
    echo
    echo -e "$P_AUTHOR"

    #命令列表
    echo -e "$F_YELLOW"
    echo "$CHOICE0"
    echo "$CHOICE1"
    echo "$CHOICE2"
    echo "$CHOICE3"
    echo "$CHOICE4"
    echo "$CHOICE5"

    #简单检测是否是 Deepin 系统
    if [[ -e $OSFILE ]]; then
        :
        INFO=$(cat $OSFILE | grep SystemName=)
        if [[ ! $INFO =~ Deepin$ ]]; then
            :
            echo -e "$A_BOLD$F_YELLOW$NOTDEEPIN$A_DEFAULT"
        fi
    else
        :
        echo -e "$P_UNKNOWISDEEPIN"
    fi

    echo
    echo -e "$P_NEXT"
    echo
    read -p "$PREFIX" -r CHOICE

    case $CHOICE in

    0)
        exit
        ;;
    1)
        while :; do

            clear
            echo -e "$F_GREEN$A_BOLD$CHOICE1$A_DEFAULT"

            FOLDER="/usr/share/dde-file-manager/extensions/appEntry"
            FILES=$(find $FOLDER -type f -name "*.desktop")

            #命令列表
            echo -e "$F_YELLOW"
            echo "$CHOICE10"
            echo "$CHOICE11"
            echo "$CHOICE12"
            echo "$CHOICE13"
            echo "$CHOICE14"

            echo -e "$P_NEXT"
            read -p "$PREFIX" -r OPT

            case $OPT in

            0)
                break
                ;;
            1)
                IFS="$NIFS"

                echo -e "$P_DISPLAY5S"
                for item in $FILES; do
                    basename "$item"
                done

                IFS="$OIFS"
                sleep 5
                ;;

            2)
                DB=()
                IFS="$NIFS"
                echo -e "$P_DISPLAY"
                I=0
                for item in $FILES; do
                    echo "$I : $(basename "$item")"
                    DB+=("$item")
                    ((I += 1))
                done

                IFS="$OIFS"
                echo -e "$P_DELINFO"
                read -r -a DELS
                for ditem in "${DELS[@]}"; do
                    sudo rm -f "${DB[$ditem]}"
                done

                unset DB

                echo -e "$P_DELFINISH"
                sleep 3
                ;;

            3)
                echo -e "$P_DELALLCONFIRM"
                read -r -n 1 YN
                if [[ $YN =~ [yY] ]]; then
                    for ditem in $FILES; do
                        sudo rm -f "$ditem"
                    done
                fi
                echo -e "$P_DELFINISH"
                sleep 3
                ;;

            4)
                echo -e "$P_ADDINFO"
                read -r PFile
                PAFILE=${PFile#*[\'\"]}
                PAFILE=${PAFILE%[\'\"]*}
                if [[ -e $PAFILE ]]; then
                    CON=$(head -n 1 "$PAFILE")
                    if [[ ${CON%%[\s]*##[\s]} != "[Desktop Entry]" ]]; then
                        echo -e "$P_ERRFILE"
                    else
                        :
                        B=$(basename "$PAFILE")
                        sudo cp "$PAFILE" "$FOLDER/$B"
                        echo -e "$P_FINISH"
                    fi
                else
                    :
                    echo -e "$P_FILENOTFOUND"
                fi
                sleep 3
                ;;
            *)
                echo -e "$P_UNSUPPORT"
                sleep 3
                ;;
            esac

        done

        ;;

    2)
        while :; do
            clear
            echo -e "$F_GREEN$A_BOLD$CHOICE2$A_DEFAULT" "（操作完毕后生效方式最简单笨办法是重启，期间不要再打开右键，否则会因重建导致失效）"

            RFOLDER="/usr/share/dde-file-manager/templates"
            UFOLDER="$HOME/.Templates"

            RFILES=$(find "$RFOLDER" -type f)
            UFILES=$(find "$UFOLDER" -type f)

            #命令列表
            echo -e "$F_YELLOW"
            echo "$CHOICE10"
            echo "$CHOICE11"
            echo "$CHOICE12"
            echo "$CHOICE13"
            echo "$CHOICE14"

            echo -e "$P_NEXT"
            read -p "$PREFIX" -r OPT

            case $OPT in

            0)
                break
                ;;

            1)
                echo -e "$P_DISPLAY5S"
                echo
                echo -e "$F_GREEN【系统自带】$A_DEFAULT"

                IFS="$NIFS"

                for item in $RFILES; do
                    basename "$item"
                done

                echo
                echo -e "$F_GREEN【用户自定义】$A_DEFAULT"

                for item in $UFILES; do
                    basename "$item"
                done

                IFS="$OIFS"
                sleep 5
                ;;

            2)
                DB=()
                IFS="$NIFS"

                echo -e "$P_DISPLAY"
                echo
                echo -e "$P_SYS"
                I=0
                for item in $RFILES; do
                    echo "$I : $(basename "$item")"
                    DB+=("$item")
                    ((I += 1))
                done

                echo
                echo -e "$P_HOME"

                for item in $UFILES; do
                    echo "$I : $(basename "$item")"
                    DB+=("$item")
                    ((I += 1))
                done

                IFS="$OIFS"
                echo -e "$P_DELINFO"
                read -r -a DELS
                for ditem in "${DELS[@]}"; do
                    sudo rm -f "${DB[$ditem]}"
                done

                unset DB

                echo -e "$P_DELFINISH"
                sleep 3
                ;;

            3)

                echo -e "$P_DELALLCONFIRM"
                read -r -n 1 YN

                IFS="$NIFS"
                if [[ $YN =~ [yY] ]]; then
                    for ditem in $RFILES; do
                        sudo rm -f "$ditem"
                    done
                    for ditem in $UFILES; do
                        sudo rm -f "$ditem"
                    done
                fi
                echo -e "$P_DELFINISH"

                IFS="$OIFS"
                sleep 3
                ;;

            4)
                echo -e "$P_ADDINFO"
                read -r PFile
                PAFILE=${PFile#*[\'\"]}
                PAFILE=${PAFILE%[\'\"]*}
                if [[ -e $PAFILE ]]; then
                    B=$(basename "$PAFILE")
                    cp "$PAFILE" "$UFOLDER/$B"
                    echo -e "$P_FINISH"
                else
                    :
                    echo -e "$P_FILENOTFOUND"
                fi
                sleep 3
                ;;

            *)
                echo -e "$P_UNSUPPORT"
                sleep 3
                ;;
            esac
        done
        ;;

    3)
        while :; do
            clear
            echo -e "$F_GREEN$A_BOLD$CHOICE3$A_DEFAULT"

            FOLDER="$HOME/.config/autostart"
            FILES=$(find "$FOLDER" -type f -name "*.desktop")

            #命令列表
            echo -e "$F_YELLOW"
            echo "$CHOICE10"
            echo "$CHOICE11"
            echo "$CHOICE12"
            echo "$CHOICE13"
            echo "$CHOICE14"

            echo -e "$P_NEXT"
            read -p "$PREFIX" -r OPT

            case $OPT in

            0)
                break
                ;;
            1)
                IFS="$NIFS"
                echo -e "$P_DISPLAY5S"
                for item in $FILES; do
                    basename "$item"
                done
                IFS="$OIFS"
                sleep 5
                ;;

            2)
                IFS="$NIFS"
                DB=()

                echo -e "$P_DISPLAY"
                I=0
                for item in $FILES; do
                    echo "$I : $(basename "$item")"
                    DB+=("$item")
                    ((I += 1))
                done

                IFS="$OIFS"
                echo -e "$P_DELINFO"
                read -r -a DELS
                for ditem in "${DELS[@]}"; do
                    sudo rm -f "${DB[$ditem]}"
                done

                unset DB
                echo -e "$P_DELFINISH"

                sleep 3
                ;;

            3)
                echo -e "$P_DELALLCONFIRM"
                read -r -n 1 YN
                IFS="$NIFS"
                if [[ $YN =~ [yY] ]]; then
                    for ditem in $FILES; do
                        sudo rm -f "$ditem"
                    done
                fi
                echo -e "$P_DELFINISH"
                IFS="$OIFS"
                sleep 3
                ;;

            4)
                echo -e "$P_ADDINFO"
                read -r PFile
                PAFILE=${PFile#*[\'\"]}
                PAFILE=${PAFILE%[\'\"]*}
                if [[ -e $PAFILE ]]; then
                    CON=$(head -n 1 "$PAFILE")
                    if [[ ${CON%%[\s]*##[\s]} != "[Desktop Entry]" ]]; then
                        echo -e "$P_ERRFILE"
                    else
                        :
                        B=$(basename "$PAFILE")
                        sudo cp "$PAFILE" "$FOLDER/$B"
                        echo -e "$P_FINISH"
                    fi
                else
                    :
                    echo -e "$P_FILENOTFOUND"
                fi
                sleep 3
                ;;
            *)
                echo -e "$P_UNSUPPORT"
                sleep 3
                ;;
            esac

        done
        ;;

    4)
        sudo apt autoremove
        sudo apt autoclean
        sudo apt clean
        echo -e "$P_FINISH"
        sleep 3
        ;;

    5)
        while :; do
            clear
            echo -e "$F_GREEN$A_BOLD$CHOICE5$A_DEFAULT"

            RFOLDER="/usr/share/applications/"
            UFOLDER="$HOME/.local/share/applications/"

            echo "$RFOLDER"
            echo "$UFOLDER"

            RFILES=$(find "$RFOLDER" -type f -name "*.desktop")
            UFILES=$(find "$UFOLDER" -type f -name "*.desktop")

            #命令列表
            echo -e "$F_YELLOW"
            echo "$CHOICE10"
            echo "$CHOICE11"
            echo "$CHOICE12"
            echo "--$CHOICE13--" "（此选项无效）"
            echo "$CHOICE14"

            echo
            echo -e "$P_NEXT"
            read -p "$PREFIX" -r OPT

            case $OPT in

            0)
                break
                ;;
            1)
                IFS="$NIFS"
                echo -e "$P_DISPLAY"
                echo
                echo -e "$P_SYS"
                for item in $RFILES; do
                    basename "$item"
                done

                echo
                echo -e "$P_HOME"

                for item in $UFILES; do
                    basename "$item"
                done

                sleep 5
                ;;

            2)
                IFS="$NIFS"
                DB=()

                echo -e "$P_DISPLAY"
                I=0

                echo
                echo -e "$P_SYS"
                for item in $RFILES; do
                    echo "$I : $(basename "$item")"
                    DB+=("$item")
                    ((I += 1))
                done

                echo
                echo -e "$P_HOME"

                for item in $UFILES; do
                    echo "$I : $(basename "$item")"
                    DB+=("$item")
                    ((I += 1))
                done

                IFS="$OIFS"
                echo -e "$P_DELINFO"
                read -r -a DELS
                for ditem in "${DELS[@]}"; do
                    sudo rm -f "${DB[$ditem]}"
                done

                unset DB
                echo -e "$P_DELFINISH"

                sleep 3
                ;;

            4)

                echo -e "$P_FILEASSOCIATION"
                echo -e "$F_BLUE"
                echo -e "请详细阅读上述内容，$P_NEXT"
                read -p "$PREFIX" -r PFile

                PAFILE=${PFile#*[\'\"]}
                PAFILE=${PAFILE%[\'\"]*}
                if [[ -e $PAFILE ]]; then
                    CON=$(head -n 1 "$PAFILE")
                    if [[ ${CON%%[\s]*##[\s]} != "[Desktop Entry]" ]]; then
                        echo -e "$P_ERRFILE"
                    else
                        :
                        B=$(basename "$PAFILE")
                        CON=$(grep <"$PAFILE" MimeType)

                        if [[ -z "$CON" ]]; then
                            echo -e "$P_ERRFILE" "（未含有 MimeType 选项）"
                        else
                            :
                            TMPFILE="$UFOLDER/$B"
                            if cp "$PAFILE" "$TMPFILE"; then

                                echo -e "$P_PROGRAMTITLE"
                                echo -e "$P_NEXT"
                                read -p "$PREFIX" -r PRTITLE

                                if [[ ! "$PRTITLE" =~ [a-zA-Z] ]]; then
                                    echo -e "$P_INVAILDINPUT"
                                else
                                    :
                                    echo -e "$P_USAGETITLE"
                                    echo -e "$P_NEXT"
                                    read -p "$PREFIX" -r USGTITLE

                                    if [[ ! "$USGTITLE" =~ [a-zA-Z] ]]; then
                                        echo -e "$P_INVAILDINPUT"
                                    else
                                        :

                                        DFILE="$HOME/desktop/$PROGRAMTITLE-$USAGETITLE.xml"

                                        {
                                            echo "<?xml version='1.0' encoding='utf-8'?>"
                                            echo "<mime-info xmlns=\"http://www.freedesktop.org/standards/shared-mime-info\">"
                                            echo "    <mime-type type=\"(?=?)\">"
                                            echo "		<comment>(?=?)</comment>"
                                            echo "		<glob pattern=\"*.(?=?)\" weight=\"80\"/>"
                                            echo "	</mime-type>"
                                            echo "</mime-info>"
                                        } >"$DFILE"

                                        echo -e "$F_PINK" "请修改为正确的内容！"
                                        echo -e "$P_PAUSECONTINUE"
                                        sudo xdg-mime install "$DFILE"

                                        MIME=${CON##=*} 
                                        sudo xdg-mime default "$TMPFILE" "$MIME"
                                        if update-mime-database /usr/share/mime; then
                                            echo -e "$P_FINISH"
                                        else
                                            :
                                            sudo rm -f "/usr/share/mime/packages/$PROGRAMTITLE-$USAGETITLE.xml"
                                            rm -f "$DFILE"
                                            rm -f "$TMPFILE"
                                            echo -e "$P_ERRFINISH"
                                        fi
                                    fi
                                fi
                            else

                                :
                                break
                            fi
                        fi
                    fi
                else
                    :
                    echo -e "$P_FILENOTFOUND"
                fi

                sleep 3
                ;;

            *)
                echo -e "$P_UNSUPPORT"
                sleep 3
                ;;
            esac

        done
        ;;

    *)
        echo -e "$P_UNSUPPORT"
        sleep 3
        ;;

    esac

done
